home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1997-10-26 | 10.5 KB | 400 lines |
- (*----------------------------------------------------------------------*
- * *
- * MAGIC Modula's All purpose GEM Interface Cadre *
- * ÿ ÿ ÿ ÿ ÿ *
- *----------------------------------------------------------------------*
- * Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
- *----------------------------------------------------------------------*
- * Dieses Modul ist urheberrechtlich geschtzt. *
- * *
- * Die Verffentlichung des Quelltextes oder Teilen daraus in schrift- *
- * licher Form, insbesondere in Zeitschriften, sowie die Verbreitung *
- * ber Public-Domain-Hndler bedarf der ausdrcklichen schriftlichen *
- * Genehmigung des Autors! *
- * *
- * Der Autor gibt hiermit die ausdrckliche Erlaubnis, das Modul jeder- *
- * zeit auch im Quelltext weiterzugegeben, sofern dessen Text und ins- *
- * besondere dieser Urheberrechts-Vermerk nicht verndert wird, und *
- * durch die Weitergabe kein finanzieller Nutzen entsteht. Der Autor *
- * behlt sich das Recht vor, diese Erlaubnis jederzeit u. ohne Angaben *
- * von Grnden zu widerrufen. *
- *----------------------------------------------------------------------*)
-
- IMPLEMENTATION MODULE MagicSys;
-
- (*----------------------------------------------------------------------*
- * MagicSys Dieses Modul soll Inkompatibilitten zwischen den ein- *
- * zelnen Compilern aufheben. *
- * *
- * WARNUNG: Dieses Modul ist auf ABSOLUT UNTERSTER EBENE! *
- *----------------------------------------------------------------------*
- * Int. Vers | Datum | Name | nderung *
- *-----------+----------+------+----------------------------------------*
- * 3.00 | 18.01.92 | Hp | *
- *-----------+----------+------+----------------------------------------*)
-
-
-
- (* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
- (* *)
- (*$R- Range-Checks *)
- (*$S- Stack-Check *)
- (* *)
- (*----------------------------------------------*)
-
-
-
-
-
-
-
-
-
- FROM SYSTEM IMPORT ADDRESS, BYTE, WORD;
-
-
-
- FROM SYSTEM IMPORT ASSEMBLER;
- IMPORT PrgCtrl;
-
-
-
-
- TYPE PtrPD = POINTER TO PD;
- PD = RECORD
- pLowtpa: ADDRESS;
- pHitpa: ADDRESS;
- pTbase: ADDRESS;
- pTlen: lCARDINAL;
- pDbase: ADDRESS;
- pDlen: lCARDINAL;
- pBbase: ADDRESS;
- pBlen: lCARDINAL;
- pDta: ADDRESS;
- pParent: ADDRESS;
- res1: ADDRESS;
- pEnv: ADDRESS;
- devx: ARRAY [0..5] OF Byte;
- res2: Byte;
- defdrv: Byte;
- pUndef: ARRAY [0..17] OF lCARDINAL;
- pCmdlin: ARRAY [0..126] OF CHAR;
- END;
-
- TYPE PtrSYSHDR = POINTER TO SYSHDR;
- SYSHDR = RECORD
- osEntry: sCARDINAL;
- osVersion: sCARDINAL;
- osStart: ADDRESS;
- osBase: ADDRESS;
- osMembot: ADDRESS;
- osShell: ADDRESS;
- osMagic: ADDRESS;
- osGendat: lCARDINAL;
- osPalmode: sCARDINAL;
- osGendatg: sCARDINAL;
- osCountry: lCARDINAL;
- root: ADDRESS;
- kbshift: ADDRESS;
- run: ADDRESS;
- END;
-
-
- VAR cast2: RECORD
- CASE : CARDINAL OF
- 0: hi: LOC;
- lo: LOC;|
- 1: int: sINTEGER;|
- 2: card: sCARDINAL;|
- 3: set: sBITSET;|
- 4: wrd: sWORD;|
- END;
- END;
-
- VAR cast4: RECORD
- CASE : CARDINAL OF
- 0: b1: LOC;
- b2: LOC;
- b3: LOC;
- b4: LOC;|
- 1: int: lINTEGER;|
- 2: crd: lCARDINAL;|
- 3: set: lBITSET;|
- 4: wrd: lWORD;|
- 5: adr: ADDRESS;|
- END;
- END;
-
- VAR base: PtrPD;
- sys: PtrSYSHDR;
- acc: BOOLEAN;
-
-
- PROCEDURE CastToChar (REF value: ARRAY OF LOC): CHAR;
- BEGIN
-
- RETURN CHAR (value[HIGH (value)]);
-
-
- END CastToChar;
-
- PROCEDURE CastToByte (REF value: ARRAY OF LOC): Byte;
- BEGIN
-
- RETURN BYTE (value[HIGH (value)]);
-
-
- END CastToByte;
-
- PROCEDURE CastToByteset (REF value: ARRAY OF LOC): ByteSet;
- BEGIN
-
- RETURN ByteSet (value[HIGH (value)]);
-
-
- END CastToByteset;
-
- PROCEDURE CastToInt (REF value: ARRAY OF LOC): sINTEGER;
- BEGIN
- IF HIGH (value) = 0 THEN
- cast2.int:= 0; cast2.lo:= value[0];
- ELSE
- cast2.hi:= value[HIGH (value)-1]; cast2.lo:= value[HIGH (value)];
- END;
- RETURN cast2.int;
- END CastToInt;
-
- PROCEDURE CastToCard (REF value: ARRAY OF LOC): sCARDINAL;
- BEGIN
- IF HIGH (value) = 0 THEN
- cast2.card:= 0; cast2.lo:= value[0];
- ELSE
- cast2.hi:= value[HIGH (value)-1]; cast2.lo:= value[HIGH (value)];
- END;
- RETURN cast2.card;
- END CastToCard;
-
- PROCEDURE CastToBitset (REF value: ARRAY OF LOC): sBITSET;
- BEGIN
- IF HIGH (value) = 0 THEN
- cast2.set:= {};
- cast2.lo:= value[0];
- ELSE
- cast2.hi:= value[HIGH (value)-1];
- cast2.lo:= value[HIGH (value)];
- END;
- RETURN cast2.set;
- END CastToBitset;
-
- PROCEDURE CastToWord (REF value: ARRAY OF LOC): sWORD;
- BEGIN
- IF HIGH (value) = 0 THEN
- cast2.int:= 0;
- cast2.lo:= value[0];
- ELSE
- cast2.hi:= value[HIGH (value)-1];
- cast2.lo:= value[HIGH (value)];
- END;
- RETURN cast2.wrd;
- END CastToWord;
-
- PROCEDURE CastToLInt (REF value: ARRAY OF LOC): lINTEGER;
- BEGIN
- CASE HIGH (value) OF
- 0: cast4.int:= 0H;
- cast4.b4:= value[0];
- |
- 1: cast4.int:= 0H;
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- |
- ELSE cast4.b1:= value[HIGH (value)-3];
- cast4.b2:= value[HIGH (value)-2];
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- END;
- RETURN cast4.int;
- END CastToLInt;
-
- PROCEDURE CastToLCard (REF value: ARRAY OF LOC): lCARDINAL;
- BEGIN
- CASE HIGH (value) OF
- 0: cast4.crd:= 0H;
- cast4.b4:= value[0];
- |
- 1: cast4.crd:= 0H;
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- |
- ELSE cast4.b1:= value[HIGH (value)-3];
- cast4.b2:= value[HIGH (value)-2];
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- END;
- RETURN cast4.crd;
- END CastToLCard;
-
- PROCEDURE CastToLBitset (REF value: ARRAY OF LOC): lBITSET;
- BEGIN
- CASE HIGH (value) OF
- 0: cast4.int:= 0H;
- cast4.b4:= value[0];
- |
- 1: cast4.int:= 0H;
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- |
- ELSE cast4.b1:= value[HIGH (value)-3];
- cast4.b2:= value[HIGH (value)-2];
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- END;
- RETURN cast4.set;
- END CastToLBitset;
-
- PROCEDURE CastToLWord (REF value: ARRAY OF LOC): lWORD;
- BEGIN
- CASE HIGH (value) OF
- 0: cast4.crd:= 0;
- cast4.b4:= value[0];
- |
- 1: cast4.crd:= 0;
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- |
- ELSE cast4.b1:= value[HIGH (value)-3];
- cast4.b2:= value[HIGH (value)-2];
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- END;
- RETURN cast4.wrd;
- END CastToLWord;
-
- PROCEDURE CastToAddr (REF value: ARRAY OF LOC): ADDRESS;
- BEGIN
- CASE HIGH (value) OF
- 0: cast4.crd:= 0H;
- cast4.b4:= value[0];
- |
- 1: cast4.crd:= 0H;
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- |
- ELSE cast4.b1:= value[HIGH (value)-3];
- cast4.b2:= value[HIGH (value)-2];
- cast4.b3:= value[HIGH (value)-1];
- cast4.b4:= value[HIGH (value)];
- END;
- RETURN cast4.adr;
- END CastToAddr;
-
- PROCEDURE Basepage (): ADDRESS;
- BEGIN
- RETURN base;
- END Basepage;
-
- PROCEDURE Accessory (): BOOLEAN;
- BEGIN
- RETURN acc;
- END Accessory;
-
- PROCEDURE SysHeader (): ADDRESS;
- BEGIN
- RETURN sys;
- END SysHeader;
-
- PROCEDURE TosVersion (): sCARDINAL;
- BEGIN
- RETURN sys^.osVersion;
- END TosVersion;
-
- PROCEDURE TosDate (): sCARDINAL;
- BEGIN
- RETURN sys^.osGendatg;
- END TosDate;
-
-
-
-
- PROCEDURE Terminate (return: sINTEGER);
- BEGIN
-
- ASSEMBLER
- MOVE.W return(A6), -(SP)
- MOVE.W #76, -(SP)
- TRAP #1
- END;
-
-
-
-
- END Terminate;
-
- PROCEDURE CallGEM (function: sINTEGER; parablock: ADDRESS);
- BEGIN
-
- ASSEMBLER
- MOVE.W function(A6), D0
- MOVE.L parablock(A6), D1
- TRAP #2
- END;
-
-
-
-
- END CallGEM;
-
- PROCEDURE VqGdos (): LONGCARD;
- VAR x: LONGINT;
- BEGIN
-
- ASSEMBLER
- MOVE.L #-2, D0
- TRAP #2
- MOVE.L D0, x(A6)
- END;
-
-
-
-
- RETURN x;
- END VqGdos;
-
- VAR hdr[04F2H]: PtrSYSHDR;
-
-
-
- VAR a: ADDRESS;
-
- PROCEDURE Super (VAR stack: ADDRESS);
- BEGIN
-
- a:= stack;
- ASSEMBLER
- MOVE.L a, -(SP)
- MOVE.W #32, -(SP)
- TRAP #1
- ADDQ.L #6, SP
- MOVE.L D0, a
- END;
- stack:= a;
-
-
-
-
- END Super;
-
- VAR y: POINTER TO ADDRESS;
- x: ADDRESS;
-
- BEGIN
-
-
-
-
- PrgCtrl.GetBasePageAddr (base);
- x:= Null; Super (x); sys:= hdr; Super (x);
-
- acc:= (base # NIL) & (base^.pParent = Null);
- END MagicSys.
-